#ifndef FORMULA_H_INCLUDED
#define FORMULA_H_INCLUDED
#include <iostream>



using namespace std;

template<bool>
class ASSERT
{ASSERT();};

template<>
class ASSERT<true>
{public:ASSERT(){}};


template<class>
inline int BestFormula(int a, int b, int c)
{
    ASSERT<false>();
    return 0;
}


template<>
inline int BestFormula<EquivalenceA<void> >(int a, int b, int c)
{
    cout << "EquivalenceA\n";
    return (a*b) / c;
}


template<>
inline int BestFormula<EquivalenceB<void> >(int a, int b, int c)
{
    cout << "EquivalenceB\n";
    return (a/c) * b;
}


template<>
inline int BestFormula<EquivalenceC<void> >(int a, int b, int c)
{
    cout << "EquivalenceC\n";
    return (b/c) * a;
}


template<>
inline int BestFormula<EquivalenceD<void> >(int a, int b, int c)
{
    cout << "EquivalenceD\n";
    return a / (c/b);
}

template<>
inline int BestFormula<EquivalenceE<void> >(int a, int b, int c)
{
    cout << "EquivalenceE\n";
    return b / (c/a);
}

/*
template<int A1, int A2,
         int B1, int B2,
         int C1, int C2 >
inline int Formula(int a, int b, int c)
{
    typedef Range<Int<A1>,Int<A2> > RangeA;
    typedef Range<Int<B1>,Int<B2> > RangeB;
    typedef Range<Int<C1>,Int<C2> > RangeC;
    return BestFormula<typename lookUP::app(RangeA)::app(RangeB)::app(RangeC)::evaluate>(a,b,c);
}
*/


#endif // FORMULA_H_INCLUDED
